package view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import java.util.Properties;
import java.util.UUID;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import model.Advertentie;
import model.CiiBay;
import model.Gebruiker;

import org.apache.commons.net.ftp.FTPClient;

import BestandFilter.ImageFilter;
import BestandFilter.Utils;
/**
 * Deze klasse behandelt het aanmaken van een nieuwe advertentie.
 * @author Yasper & Nick & Jaap
 * @version 1
 */


@SuppressWarnings("serial")


public class AdvertentieAanmaakPaneel extends JPanel implements Observer {

	private JPanel totaal;
	private JLabel titel, beschrijving, categorie, prijs, plaatje, tags,bieden;
	private JTextField titelVeld, prijsVeld, urlVeld,tagsVeld;
	private JTextArea beschrijvingVeld;
	private JComboBox categorieBox;
	private JButton okKnop, bladeren, reset;
	private JScrollPane scroll;
	private JCheckBox biedenBox;
	private CiiBay ciiBay;
	private String bestandsNaam = "";
	private ActionListener nieuw, update;
	private ArrayList<String> categorieen;
	/**
	 * Constructor. Maakt de invoervelden en labels aan en plaatst ze in een GridBagLayout.
	 * @author Yasper
	 * @author Nick
	 * */
	public AdvertentieAanmaakPaneel(CiiBay ciibay){
		ciibay.getCategories();
		this.ciiBay = ciibay;
		ciiBay.addObserver(this);
		totaal = new JPanel(new GridLayout(3,1));
		titel = new JLabel("Titel:   ");
		beschrijving = new JLabel("Beschrijving:   ");
		categorie = new JLabel("Categorie:   ");
		prijs = new JLabel("Min. Prijs:   ");
		tags = new JLabel("Tags:	");
		plaatje = new JLabel("Foto:   ");
		bieden = new JLabel("Vaste prijs:	");
		nieuw = new submitButton();
		update = new updateButton();
		titelVeld = new JTextField();
		titelVeld.setDocument(new MaxAantalKarakters(50));
		prijsVeld = new JTextField("0");
		prijsVeld.setDocument(new MaxAantalKarakters(10));
		urlVeld = new JTextField();
		urlVeld.setDocument(new MaxAantalKarakters(250));
		urlVeld.setEditable(false);
		bladeren = new JButton("Bladeren");
		bladeren.addActionListener(new BladerenHandler());
		tagsVeld = new JTextField();
		tagsVeld.setDocument(new MaxAantalKarakters(100));

		beschrijvingVeld = new JTextArea(50,20);
		beschrijvingVeld.setMaximumSize(new Dimension(100,40));
		beschrijvingVeld.setDocument(new MaxAantalKarakters(250));
		scroll = new JScrollPane(beschrijvingVeld);

		biedenBox = new JCheckBox();
		biedenBox.addActionListener(new CheckBiedenHandler());
		categorieen =ciiBay.getCategories();
		categorieen.remove(0);
		categorieBox = new JComboBox(categorieen.toArray());
		okKnop = new JButton("OK");
		reset = new JButton("Reset");
		reset.addActionListener(new resetButton());
		biedenBox.setBackground(Color.ORANGE);
		okKnop.addActionListener(nieuw);

		setLayout(new GridBagLayout());
		maakView();
	}

	/**
	 * @author Yasper
	 * @author Nick
	 * Deze methode maakt alle invoervelden aan dit staat apart om alles mooi duidelijk te houden.
	 */
	public void maakView(){
		int y;
		y = 0;
		GridBagConstraints c = new GridBagConstraints();
		JPanel bovenste = new JPanel(new GridBagLayout());
		JPanel onderste = new JPanel(new GridLayout(5,1));
		c.fill = GridBagConstraints.HORIZONTAL;
		c.gridx = 0;
		c.gridy = y;
		bovenste.add(titel,c);
		c.ipadx = 100;
		c.gridx = 1;
		c.gridy = y;
		bovenste.add(titelVeld,c);
		y++;
		c.gridx = 0;
		c.gridy = y;
		bovenste.add(bieden, c);
		c.gridx = 1;
		c.gridy = y;
		bovenste.add(biedenBox, c);
		y++;
		c.gridx = 0;
		c.gridy = y;
		bovenste.add(prijs,c);
		c.gridx=1;
		c.gridy=y;
		bovenste.add(prijsVeld, c);
		totaal.add(bovenste);
		y++;
		c.gridx = 0;
		c.gridy = y;
		bovenste.add(categorie,c);
		c.gridx = 1;
		c.gridy = y;
		bovenste.add(categorieBox,c);
		y++;
		c.gridx = 0;
		c.gridy = y;
		bovenste.add(beschrijving,c);

		totaal.add(scroll);

		JPanel foto = new JPanel();
		foto.setBackground(Color.ORANGE);
		foto.setLayout(new GridLayout(1,2));
		foto.add(urlVeld);
		JPanel knoppen = new JPanel();
		knoppen.setLayout(new GridLayout(1,2));
		knoppen.add(reset);
		knoppen.add(okKnop);
		knoppen.setBackground(Color.ORANGE);
		foto.add(bladeren);
		onderste.add(tags);
		onderste.add(tagsVeld);
		onderste.add(plaatje);
		onderste.add(foto);
		onderste.add(knoppen);
		totaal.add(onderste);


		this.setBackground(Color.ORANGE);
		totaal.setBackground(Color.ORANGE);
		bovenste.setBackground(Color.ORANGE);
		onderste.setBackground(Color.ORANGE);
		add(totaal);
		categorieBox.remove(1);
		categorieBox.revalidate();
	}

	/**
	 * Genereert een random string met de meegegeven lengte
	 * @param lengte - De lengte van de string
	 * @return Random string
	 * @author Jaap & Dennis
	 */
	public String getRandomNaam(int lengte){
		UUID uuid = UUID.randomUUID();
		String myRandom = uuid.toString();
		return myRandom.substring(lengte);
	}
	/**
	 * Reset alle invoervelden
	 * @author Jaap
	 */
	public void resetVelden(){
		titelVeld.setText("");
		prijsVeld.setText("0");
		beschrijvingVeld.setText("");
		tagsVeld.setText("");
		urlVeld.setText("");
	}


	/**
	 * Zorgt ervoor dat het categorie selectie vak up to date blijft en of het paneel gebruikt wordt voor toevoegen of updaten
	 * @author Jaap
	 */
	@Override
	public void update(Observable arg0, Object arg1) {
		String message = (String) arg1;
		if(message.equals("nieuwecategorie")){
			categorieBox.removeAllItems();
			categorieen =ciiBay.getCategories();
			categorieen.remove(0);
			for(Object obj : categorieen){
				categorieBox.addItem(obj);
			}
			revalidate();
			repaint();
		}else if(message.equals("AdvertentieAanmaakView")){
			for(ActionListener a : okKnop.getActionListeners()){
				okKnop.removeActionListener(a);
			}
			okKnop.addActionListener(nieuw);
			resetVelden();
		}else if(message.equals("wijzigAdvertentie")){
			for(ActionListener a : okKnop.getActionListeners()){
				okKnop.removeActionListener(a);
			}
			okKnop.addActionListener(update);
			Advertentie ad = ciiBay.getGeklikteAdvertentie();
			titelVeld.setText(ad.getTitel());
			biedenBox.setSelected(ad.getBieden());
			prijsVeld.setText("" + ad.getPrijs());
			beschrijvingVeld.setText(ad.getBeschrijving());
			tagsVeld.setText(ad.getTags());
		}
	}

	/**
	 * De listener voor de update knop
	 * @author Jaap
	 *
	 */
	class updateButton implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent arg0) {
			String message = "";
			try{
				String titel = titelVeld.getText();
				double prijs = Double.parseDouble(prijsVeld.getText());
				if(prijs < 0) {
					prijs = Double.parseDouble("foute invoer");
				}
				File file = null;
				FileInputStream fis = null;
				ImageIcon foto = null;
				if(!urlVeld.getText().equals("")){
					file = new File(urlVeld.getText());
					String extension = Utils.getExtension(file);
					if (!extension.equals(Utils.tiff) && !extension.equals(Utils.tif) && !extension.equals(Utils.jpeg) && !extension.equals(Utils.jpg) && !extension.equals(Utils.png)){
						file = new File("./files/geenFoto.jpg");
					}
				}else{
					file = new File("./files/geenFoto.jpg");
				}
				fis = new FileInputStream(file);
				foto = new ImageIcon(urlVeld.getText());
				String beschrijving = beschrijvingVeld.getText();
				String tags = tagsVeld.getText();
				Gebruiker verkoper = (Gebruiker) ciiBay.getIngelogtPersoon();
				Gebruiker koper = null;
				boolean checkbox = biedenBox.isSelected();
				String categorie = (String)categorieBox.getSelectedItem();
				String wijzigDatum = ciiBay.datumVandaag();
				if(!urlVeld.getText().equals("")){
					message = ciiBay.advertentieWijzigen(titel,prijs,beschrijving, verkoper, koper, tags, checkbox, categorie, wijzigDatum, file, fis, foto);
				}else{
					message = ciiBay.advertentieWijzigen(titel, prijs, beschrijving, verkoper, koper, tags, checkbox, categorie, wijzigDatum);
				}
			}
			catch(NumberFormatException nfe){
				message = "Foute prijs invoer";
			} catch (FileNotFoundException e) {
				message= "Foto niet gevonden";
			}
			JOptionPane.showMessageDialog(null, message, "",
					JOptionPane.PLAIN_MESSAGE);
			if(message.equals("Advertentie gewijzigd!")){
				ciiBay.veranderView("welkom");
				resetVelden();
				ciiBay.veranderView("advertentieView");
			}

		}

	}
	/**
	 * 
	 * @author Nick, Yasper
	 * deze methode verwerkt de input van het invoerveld en maakt een nieuwe advertentie aan.
	 */
	class submitButton implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent arg0) {
			String message = "";
			try{
				String titel = titelVeld.getText();
				double prijs = Double.parseDouble(prijsVeld.getText());
				if(prijs < 0) {
					prijs = Double.parseDouble("foute invoer");
				}

				File file = null;
				FileInputStream fis = null;
				ImageIcon foto = null;
				if(!urlVeld.getText().equals("")){
					file = new File(urlVeld.getText());
					String extension = Utils.getExtension(file);
					if(extension != null) {
						if (!extension.equals(Utils.tiff) && !extension.equals(Utils.tif) && !extension.equals(Utils.jpeg) && !extension.equals(Utils.jpg) && !extension.equals(Utils.png)){
							file = new File("./files/geenFoto.jpg");
						}
					} else {
						file = new File("./files/geenFoto.jpg");
					}
				}else{
					file = new File("./files/geenFoto.jpg");
				}
				fis = new FileInputStream(file);
				foto = new ImageIcon(urlVeld.getText());

				String beschrijving = beschrijvingVeld.getText();
				String tags = tagsVeld.getText();
				Gebruiker verkoper = (Gebruiker) ciiBay.getIngelogtPersoon();
				Gebruiker koper = null;
				boolean checkbox = biedenBox.isSelected();
				String categorie = (String)categorieBox.getSelectedItem();
				String datum = ciiBay.datumVandaag();
				message = ciiBay.advertentieToevoegen(titel,prijs,verkoper, koper, beschrijving, tags, checkbox, categorie, datum, foto, fis, file, datum);
			}
			catch(NumberFormatException nfe){
				message = "Foute prijs invoer";
			}
			catch (FileNotFoundException e) {
				message= "Foto niet gevonden";
			}
			JOptionPane.showMessageDialog(null, message, "",
					JOptionPane.PLAIN_MESSAGE);
			if(message.equals("Advertentie toegevoegd!")){
				ciiBay.veranderView("welkom");
				resetVelden();
			}
		}
	}

	/**
	 * Zorgt voor een popup om een bestand te selecteren
	 * @author Jaap
	 *
	 */
	class BladerenHandler implements ActionListener{
		public void actionPerformed(ActionEvent e){
			JFileChooser fc = new JFileChooser();
			fc.addChoosableFileFilter(new ImageFilter());
			fc.setAcceptAllFileFilterUsed(false);
			int returnVal = fc.showOpenDialog(null);

			if (returnVal == JFileChooser.APPROVE_OPTION) {
				File file = fc.getSelectedFile();
				urlVeld.setText(file.getPath());
				bestandsNaam = file.getPath();
			}
		}

	}

	/**
	 * Reset de invoervelden als op de resetknop geklikt wordt
	 * @author Jaap & Dennis
	 *
	 */
	class resetButton implements ActionListener{
		public void actionPerformed(ActionEvent e){
			resetVelden();
		}
	}

	/**
	 * Zorgt ervoor dat de tekst verandert van de Labels wanneer de checkbox is aangevinkt
	 * @author Dennis & Jaap
	 *
	 */
	class CheckBiedenHandler implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			boolean gekozen = biedenBox.isSelected();
			if(gekozen) {
				prijs.setText("Prijs:   ");
			} else {
				prijs.setText("Min. prijs:   ");
			}
		}
	}
}